package com.kilon.workfaq.util;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.UUID;

/**
 * @author LiuTBaby
 * blog: cnblogs.com/lbao
 * @version 1.0
 * @date: 2022/6/27 9:37
 */
public class LocalUploadImageUtils {
    /**
     * 保存图片目录名，默认resources/static下
     */
    public static final String IMAGE_DIR_NAME = "/workspaces/uploadfiles/images/img/";
    private static final String WEBURL = "https://jmgc.mzt.ln.gov.cn/faq/images/";

    /**
     * 上传图片到服务器，默认保存在image文件夹下，文件名前默认加上uuid
     *
     * @param file 上传图片
     * @return 文件访问路径
     */
    public static String uploadImageFile(MultipartFile file) {

        String newFileName = getNewFileNameByUuid(file.getOriginalFilename());

        String finalPath = ConfigFileMessageUtils.IMAGE_ALL_DIR + newFileName;

        //String url = "http://"
        //        + ConfigFileMessageUtils.LOCAL_IP+ ":"
        //        + ConfigFileMessageUtils.SERVER_PORT + "/"
        //        + ConfigFileMessageUtils.IMAGE_DIR_NAME + "/"
        //        + newFileName;
        String url = WEBURL+ newFileName;

        boolean flag = upload(file, finalPath);

        if (!flag) {
            throw new RuntimeException("图片上传失败");
        }
        return url;
    }

    /**
     * 上传图片到本地服务器，文件名自定义
     *
     * @param file     图片文件
     * @param fileName 自定义文件名
     * @return 文件访问路径
     */
    //public static String uploadImageFile(MultipartFile file, String fileName) {
    //
    //    String finalPath = ConfigFileMessageUtils.IMAGE_ALL_DIR + fileName;
    //
    //    String url = "http://"
    //            + ConfigFileMessageUtils.LOCAL_IP + ":"
    //            + ConfigFileMessageUtils.SERVER_PORT + "/"
    //            + ConfigFileMessageUtils.IMAGE_DIR_NAME + "/"
    //            + fileName;
    //
    //    boolean flag = upload(file, finalPath);
    //
    //    if (!flag) {
    //        throw new RuntimeException("图片上传失败");
    //    }
    //    return url;
    //}

    /**
     * 为文件名添加前缀c
     *
     * @param fix      需添加的前缀
     * @param fileName 文件名
     * @return 新的文件名
     */
    public static String addFixForFileName(String fix, String fileName) {
        return fix + getFileSuffix(fileName);
    }

    /**
     * 上传文件到服务器
     *
     * @param file      需要上传的文件
     * @param finalPath 文件存放的服务器路径
     * @return 上传成功返回true，失败返回false
     */
    private static boolean upload(MultipartFile file, String finalPath) {

        File dest = new File(finalPath);

        //判断文件父目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }
        //上传文件到服务器，相当于将内存的文件输出到服务器，OutputStream,需要try....catch....
        try {
            //保存文件
            //transferTo（dest）方法将上传文件写到服务器上指定的文件
            file.transferTo(dest);
            return true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    }

    private static String getNewFileNameByUuid(String fileName) {
        return getUUID() + getFileSuffix(fileName);
    }

    private static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    private static String getFileSuffix(String fileName) {
        return fileName.substring(fileName.lastIndexOf("."));
    }

}

/**
 * 读取图片所需基本信息
 */
@Component
class ConfigFileMessageUtils implements InitializingBean {

    @Value("${server.port}")
    private String serverPort;
    /**
     * 本机IP地址
     */
    public static String LOCAL_IP;
    /**
     * 本机服务器端口号
     */
    public static String SERVER_PORT;

    /**
     * 图片存放的全路径名
     */
    public static String IMAGE_ALL_DIR;

    /**
     * 该方法在服务器加载时被调用
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {

        SERVER_PORT = this.serverPort;

        LOCAL_IP = InetAddress.getLocalHost().getHostAddress();

        //IMAGE_ALL_DIR = System.getProperty("user.dir") + "/src/main/resources/static/" + LocalUploadImageUtils.IMAGE_DIR_NAME;//本级运行
        //IMAGE_ALL_DIR = System.getProperty("user.dir") +  LocalUploadImageUtils.IMAGE_DIR_NAME;//本级运行
        IMAGE_ALL_DIR = LocalUploadImageUtils.IMAGE_DIR_NAME + "/";//云服务器运行

    }
}
